/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servicios;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import javax.ws.rs.*;
import modelos.Cliente;
import modelos.Pago;
import modelos.Producto;
import modelos.Venta;
import modelos.VentaDetalle;
import org.json.JSONArray;
import org.json.JSONObject;

/**
 *
 * @author Verena
 */
@Path("/rest")
@Produces({"application/json"})
public class RestServices {

    private static Collection<Cliente> listaClientes = cargarClientes();
    private static Collection<Producto> listaProductos = cargarProductos();
    private static Collection<Venta> listaVentas = cargarVentas();
    private static Collection<Pago> listaPagos = cargarPagos();

    public static Collection<Cliente> cargarClientes() {
        Collection<Cliente> lista = new HashSet<Cliente>();

        Cliente cli1 = new Cliente("Verena", "Ojeda", "3893208", "jejui", "191678");
        Cliente cli2 = new Cliente("Juan", "Ruax", "3552348", "ines", "245077");
        Cliente cli3 = new Cliente("Camilo", "Baez", "4250872", "decima pyda", "462008");
        lista.add(cli1);
        lista.add(cli2);
        lista.add(cli3);
        return lista;
    }
    
    public void cargarClientes2() {
        //Collection<Cliente> listaClientes = new HashSet<Cliente>();

        Cliente cli1 = new Cliente("Verena", "Ojeda", "3893208", "jejui", "191678");
        Cliente cli2 = new Cliente("Juan", "Ruax", "3552348", "ines", "245077");
        Cliente cli3 = new Cliente("Camilo", "Baez", "4250872", "decima pyda", "462008");
        listaClientes.add(cli1);
        listaClientes.add(cli2);
        listaClientes.add(cli3);
        //return lista;
    }

    public static Collection<Producto> cargarProductos() {
        Collection<Producto> lista = new HashSet<Producto>();
        Producto pro1 = new Producto("111111", "Articulo1", "Articulo1", 100000, 150000, 50);
        Producto pro2 = new Producto("222222", "Articulo2", "Articulo2", 150000, 200000, 30);
        Producto pro3 = new Producto("333333", "Articulo3", "Articulo3", 200000, 250000, 10);
      
        lista.add(pro1);
        lista.add(pro2);
        lista.add(pro3);
        return lista;
    }

    public static Collection<Venta> cargarVentas() {
        Collection<Venta> lista = new HashSet<Venta>();
        int i = 0;
        for (Cliente cliente : listaClientes) {
            i++;
            double total = 0;
            List<VentaDetalle> listaVta = new ArrayList<VentaDetalle>();
            for (Producto producto : listaProductos) {
                VentaDetalle vtaDet = new VentaDetalle(producto,1);
                listaVta.add(vtaDet);
                total = total + producto.getPrecio();
            }
            // en este caso van a estar todas pendientes nomas, cuando se hace un pago deberia cambiar a cancelada
            Venta vta = new Venta(new Date(),"0000"+i, "pendiente", total, cliente, listaVta);
            lista.add(vta);
        }
      return lista;
    }
    
     public static Collection<Pago> cargarPagos() {
        Collection<Pago> lista = new HashSet<Pago>();
        for (Venta venta : listaVentas) {
            if(venta.getIdVenta()== 1){
                // se paga la venta con id 1
                Pago pago = new Pago(new Date(), "00001", venta.getTotal(), venta);
                lista.add(pago);
                venta.setEstado("pagada");
            }
            if(venta.getIdVenta()== 2){
                // se paga la venta con id 2
                Pago pago = new Pago(new Date(), "00002", venta.getTotal(), venta);
                lista.add(pago);
                venta.setEstado("pagada");
            }
;
        }
      return lista;
    }

    /*
     * ABML CLIENTES
     */
    @GET
    @Path("/clientes")
    public String listadoClientes() {
        
       // this.cargarClientes2();
        JSONArray arr = new JSONArray();
        for (Cliente cliente : listaClientes) {
            JSONObject obj = new JSONObject();
            obj.put("id", cliente.getIdCliente());
            obj.put("nombre", cliente.getNombre());
            obj.put("apellido", cliente.getApellido());
            obj.put("cedula", cliente.getCedula());
            obj.put("direccion", cliente.getDireccion());
            obj.put("telefono", cliente.getTelefono());

            arr.put(obj);
        }
        return arr.toString();
    }

    @POST
    @Path("/cliente")
    
    public String altaCliente(@FormParam("nombre") String nombre, @FormParam("apellido") String apellido, @FormParam("cedula") String cedula, @FormParam("direccion") String direccion, @FormParam("telefono") String telefono) {
        try {
            //System.out.println("parametros: " + nombre + "  " + ci + "  " + telefono + " id " + Cliente.getId());
            Cliente cliente = new Cliente(nombre, apellido, cedula, direccion, telefono);
            this.listaClientes.add(cliente);
            return "0";
        } catch (Exception e) {
            return "1";
        }

    }

    @PUT
    @Path("/cliente/{id}")
    public String modificacionCliente(@PathParam("id") String id, @FormParam("nombre") String nombre, @FormParam("apellido") String apellido, @FormParam("cedula") String cedula, @FormParam("direccion") String direccion, @FormParam("telefono") String telefono) {
        //System.out.println(" el id recibido es: " + id);
        try {
            System.out.println("parametros: " + id + "  " + nombre + "  " + apellido + " id " + cedula);
            boolean existe = false;
            for (Cliente cliente : this.listaClientes) {
                int idInt = Integer.parseInt(id);
                if (cliente.getIdCliente() == idInt) {
                    existe = true;
                    cliente.setNombre(nombre);
                    cliente.setApellido(apellido);
                    cliente.setCedula(cedula);
                    cliente.setDireccion(direccion);
                    cliente.setTelefono(telefono);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    @DELETE
    @Path("/cliente/{id}")
    public String bajaCliente(@PathParam("id") String id) {
        //System.out.println("ci de parametro: " + id);
        try {

            boolean existe = false;
            for (Cliente cliente : this.listaClientes) {
                int idInt = Integer.parseInt(id);
                if (cliente.getIdCliente() == idInt) {
                    existe = true;
                    this.listaClientes.remove(cliente);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    /*
     * ABML PRODUCTOS
     */
    @GET
    @Path("/productos")
    public String listadoProductos() {

        JSONArray arr = new JSONArray();
        for (Producto producto : listaProductos) {
            JSONObject obj = new JSONObject();
            obj.put("id", producto.getIdProd());
            obj.put("codigo", producto.getCodigo());
            obj.put("nombre", producto.getNombre());
            obj.put("descripcion", producto.getDescripcion());
            obj.put("costo", producto.getCosto());
            obj.put("precio", producto.getPrecio());
            obj.put("existencia", producto.getExistencia());

            arr.put(obj);
        }
        return arr.toString();
    }

    @POST
    @Path("/producto")
    public String altaProducto(@FormParam("codigo") String codigo, @FormParam("nombre") String nombre, @FormParam("descripcion") String descripcion, @FormParam("costo") String costo, @FormParam("precio") String precio, @FormParam("existencia") String existencia) {

        try {
            System.out.println("parametros: " + nombre + "  " + codigo+ "  " + descripcion+ "  " + precio+ "  " + costo+ "  " + existencia);
            double costoDouble = Double.parseDouble(costo);
            double precioDouble = Double.parseDouble(precio);
            int existenciaInt = Integer.parseInt(existencia);
            System.out.println("parametros: " + nombre + "  " + codigo+ "  " + descripcion+ "  " + precio+ "  " + costo+ "  " + existencia);

            Producto producto = new Producto(codigo, nombre, descripcion, costoDouble, precioDouble, existenciaInt);
            this.listaProductos.add(producto);
            return "0";
        } catch (Exception e) {
            return "1";
        }

    }

    @PUT
    @Path("/producto/{id}")
    public String modificacionProducto(@PathParam("id") String id, @FormParam("codigo") String codigo, @FormParam("nombre") String nombre, @FormParam("descripcion") String descripcion, @FormParam("costo") String costo, @FormParam("precio") String precio, @FormParam("existencia") String existencia) {
        //System.out.println(" el id recibido es: " + id);
        try {
            //System.out.println("parametros: " + nombre + "  " + ci + "  " + telefono + " id " + Cliente.getId());
            boolean existe = false;
            double costoDouble = Double.parseDouble(costo);
            double precioDouble = Double.parseDouble(precio);
            int existenciaInt = Integer.parseInt(existencia);

            for (Producto producto : this.listaProductos) {
                int idInt = Integer.parseInt(id);
                if (producto.getIdProd() == idInt) {
                    existe = true;
                    producto.setCodigo(codigo);
                    producto.setNombre(nombre);
                    producto.setDescripcion(descripcion);
                    producto.setCosto(costoDouble);
                    producto.setPrecio(precioDouble);
                    producto.setExistencia(existenciaInt);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    @DELETE
    @Path("/producto/{id}")
    public String bajaProducto(@PathParam("id") String id) {
        //System.out.println("ci de parametro: " + id);
        try {
            System.out.println("entro a eliminar producto - id " + id);
            boolean existe = false;
            for (Producto producto : this.listaProductos) {
                int idInt = Integer.parseInt(id);
                System.out.println("encontro el id " + id);
                if (producto.getIdProd() == idInt) {
                    existe = true;
                    this.listaProductos.remove(producto);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    /*
     * ABML VENTAS
     */
    @GET
    @Path("/ventas")
    public String listadoVentas() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        JSONArray arr = new JSONArray();
        for (Venta venta : listaVentas) {
            String fechaDate = df.format(venta.getFecha());
            JSONObject obj = new JSONObject();
            obj.put("id", venta.getIdVenta());
            obj.put("fecha", fechaDate);
            obj.put("numeroVta", venta.getNumeroVta());
            obj.put("total", venta.getTotal());

            /*Cliente cliente = venta.getCliente();
            JSONObject objCli = new JSONObject();
            objCli.put("id", cliente.getIdCliente());
            objCli.put("cedula", cliente.getCedula());
            objCli.put("nombre", cliente.getNombre());
            objCli.put("apellido", cliente.getApellido());
            objCli.put("direccion", cliente.getDireccion());
            objCli.put("telefono", cliente.getTelefono());

            obj.put("cliente", objCli);

            List<VentaDetalle> listaVtaDetalles = venta.getVtaDetalles();
            JSONArray arrDet = new JSONArray();
            for (VentaDetalle ventaDetalle : listaVtaDetalles) {
                JSONObject objVtaDet = new JSONObject();
                objVtaDet.put("id", ventaDetalle.getIdVtaDet());

                 Producto producto = ventaDetalle.getProducto();
                 JSONObject objPro = new JSONObject();
                 objPro.put("id", producto.getIdProd());
                 objPro.put("codigo", producto.getCodigo());
                 objPro.put("nombre", producto.getNombre());
                 objPro.put("descripcion", producto.getDescripcion());
                 objPro.put("costo", producto.getCosto());
                 objPro.put("precio", producto.getPrecio());
                 objPro.put("existencia", producto.getExistencia());

                objVtaDet.put("cantidad", ventaDetalle.getCantidad());

                arrDet.put(objVtaDet);
            }

            obj.put("listaVtaDetalles", arrDet);*/

            obj.put("cliente", venta.getCliente().getNombre()+" "+venta.getCliente().getApellido());
            arr.put(obj);
        }
        return arr.toString();
    }

    @POST
    @Path("/venta")
    public String altaVenta(@FormParam("fecha") String fecha, @FormParam("numeroVta") String numeroVta, @FormParam("total") String total, @FormParam("cliente") String idCliente, @FormParam("listaVentaDetalles") String listaVentaDetalles) {

        try {
            System.out.println("fecha" + fecha + " numeroVta " + numeroVta + "  total " + total + " cliente " + idCliente+" detalles "+ listaVentaDetalles);
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date fechaDate = df.parse(fecha);
            double totalDouble = Double.parseDouble(total);
            System.out.println("aaaa"+listaVentaDetalles);
            List<VentaDetalle> listaVtaDetalles = this.parsearVtaDetalles(listaVentaDetalles);

            Cliente cliente = this.obtenerCliente(idCliente);

            Venta venta = new Venta(fechaDate, numeroVta, "pendiente", totalDouble, cliente, listaVtaDetalles);
            this.listaVentas.add(venta);
            return "0";
        } catch (Exception e) {
            System.out.println(e);
            return "1";
        }

    }

    @PUT
    @Path("/venta/{id}")
    public String modificacionVenta(@PathParam("id") String id, @FormParam("fecha") String fecha, @FormParam("numeroVta") String numeroVta, @FormParam("total") String total, @FormParam("cliente") String idCliente, @FormParam("listaVentaDetalles") String listaVentaDetalles) {
        //System.out.println(" el id recibido es: " + id);
        try {
            //System.out.println("parametros: " + nombre + "  " + ci + "  " + telefono + " id " + Cliente.getId());
            boolean existe = false;
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date fechaDate = df.parse(fecha);
            double totalDouble = Double.parseDouble(total);

            List<VentaDetalle> listaVtaDetalles = this.parsearVtaDetalles(listaVentaDetalles);

            Cliente cliente = this.obtenerCliente(idCliente);

            for (Venta venta : this.listaVentas) {
                int idInt = Integer.parseInt(id);
                if (venta.getIdVenta() == idInt) {
                    existe = true;
                    venta.setFecha(fechaDate);
                    venta.setNumeroVta(numeroVta);
                    venta.setTotal(totalDouble);
                    venta.setCliente(cliente);
                    venta.setVtaDetalles(listaVtaDetalles);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    @DELETE
    @Path("/venta/{id}")
    public String bajaVenta(@PathParam("id") String id) {
        //System.out.println("ci de parametro: " + id);
        try {

            boolean existe = false;
            for (Venta venta : this.listaVentas) {
                int idInt = Integer.parseInt(id);
                if (venta.getIdVenta() == idInt) {
                    existe = true;
                    this.listaVentas.remove(venta);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }
    
    @GET
    @Path("/ventaDetalles/{id}")
    public String listadoVentaDetalles(@PathParam("id") String id ) {

        JSONArray arr = new JSONArray();
        for (Venta venta : listaVentas) {
            JSONObject obj = new JSONObject();
            List<VentaDetalle> lista= new ArrayList<VentaDetalle>();
            int idInt = Integer.parseInt(id);
            if (venta.getIdVenta() == idInt) {
                lista=venta.getVtaDetalles();
                // this.listaVentas.remove(venta);
                for(VentaDetalle ventaDetalle: lista){
                    obj = new JSONObject();
                    obj.put("id", ventaDetalle.getIdVtaDet());
                    obj.put("producto", ventaDetalle.getProducto().getNombre());
                    obj.put("cantidad", ventaDetalle.getCantidad());
                    arr.put(obj);
                }
                
                break;
            }

        }
        System.out.println(arr.toString());
        return arr.toString();
    }

    /*
     * ABML PAGOS
     */
    @GET
    @Path("/pagos")
    public String listadoPagos() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        JSONArray arr = new JSONArray();
        for (Pago pago : listaPagos) {
            String fechaDate = df.format(pago.getFecha());
            JSONObject obj = new JSONObject();
            obj.put("id", pago.getIdPago());
            obj.put("fecha", fechaDate);
            obj.put("numeroPago", pago.getNumeroPago());
            obj.put("monto", pago.getMonto());

            /*JSONObject objVta = new JSONObject();
            objVta.put("id", pago.getVenta().getIdVenta());
            objVta.put("numeroVta", pago.getVenta().getNumeroVta());
            objVta.put("total", pago.getVenta().getTotal());*/
            
            obj.put("numeroVta", pago.getVenta().getNumeroVta());
            obj.put("totalVta", pago.getVenta().getTotal());

            arr.put(obj);
        }
        //System.out.println(arr.toString());
        return arr.toString();
    }

    @POST
    @Path("/pago")
    public String altaPago(@FormParam("fecha") String fecha, @FormParam("numeroPago") String numeroPago, @FormParam("numeroVenta") String numeroVenta, @FormParam("monto") String monto) {

        try {
            System.out.println("parametros: " + fecha + "  " + numeroPago + "  " + numeroVenta + " " + monto);
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date fechaDate = df.parse(fecha);
            double montoDouble = Double.parseDouble(monto);
            Venta venta = this.obtenerVenta(numeroVenta);
            System.out.println("venta id: " + venta.getIdVenta());

            Pago pago = new Pago(fechaDate, numeroPago, montoDouble, venta);
            this.listaPagos.add(pago);
            return "0";
        } catch (Exception e) {
            return "1";
        }

    }

    @PUT
    @Path("/pago/{id}")
 public String modificacionPago(@PathParam("id") String id, @FormParam("fecha") String fecha, @FormParam("numeroPago") String numeroPago, @FormParam("venta") String numeroVenta, @FormParam("monto") String monto) {        //System.out.println(" el id recibido es: " + id);
        try {
            //System.out.println("parametros: " + nombre + "  " + ci + "  " + telefono + " id " + Cliente.getId());
            boolean existe = false;
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Date fechaDate = df.parse(fecha);
            double montoDouble = Double.parseDouble(monto);
            //Venta venta = this.obtenerVenta(idVenta);

            for (Pago pago : this.listaPagos) {
                int idInt = Integer.parseInt(id);
                if (pago.getIdPago() == idInt) {
                    existe = true;
                    pago.setFecha(fechaDate);
                    pago.setNumeroPago(numeroPago);
                    pago.setMonto(montoDouble);
                    pago.setVenta(pago.getVenta());
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    @DELETE
    @Path("/pago/{id}")
    public String bajaPago(@PathParam("id") String id) {
        //System.out.println("ci de parametro: " + id);
        try {

            boolean existe = false;
            for (Pago pago : this.listaPagos) {
                int idInt = Integer.parseInt(id);
                if (pago.getIdPago() == idInt) {
                    existe = true;
                    this.listaPagos.remove(pago);
                    break;
                }
            }

            if (existe) {
                return "0";
            } else {
                return "1";
            }
        } catch (Exception e) {
            return "1";
        }

    }

    public Cliente obtenerCliente(String idCliente) {
        Cliente cli = new Cliente();
        for (Cliente cliente : this.listaClientes) {
            int idInt = Integer.parseInt(idCliente);
            if (cliente.getIdCliente() == idInt) {
                cli = cliente;
            }
        }
        return cli;
    }

    public Venta obtenerVenta(String numeroVenta) {
        Venta ven = new Venta();
        for (Venta venta : this.listaVentas) {
            //int idInt = Integer.parseInt(numeroVenta);
            if ((venta.getNumeroVta()).compareTo(numeroVenta)==0) {
                ven = venta;
            }
        }
        return ven;
    }

    public Producto obtenerProducto(String idProd) {
        Producto pro = new Producto();
        for (Producto producto : this.listaProductos) {
            int idInt = Integer.parseInt(idProd);
            if (producto.getIdProd() == idInt) {
                pro = producto;
            }
        }
        return pro;
    }

    public List<VentaDetalle> parsearVtaDetalles(String listaVtaDetalles) {
        List<VentaDetalle> listaVtaDetalle = new ArrayList<VentaDetalle>();
        try {
            JSONArray arr = new JSONArray(listaVtaDetalles);
            for (int i = 0; i < arr.length(); i++) {
                JSONObject obj = arr.getJSONObject(i);
                VentaDetalle vtaDetalle = new VentaDetalle();
                // el que crea de cero tiene que setearle el id.. el que no tiene que buscar segun el id y modificar
                //vtaDetalle.setIdVtaDet(obj.getInt("idVtaDet"));
                vtaDetalle.setCantidad(obj.getInt("cantidad"));
                
                Producto producto = this.obtenerProducto(obj.getString("idProd"));
                producto.setExistencia(producto.getExistencia()-vtaDetalle.getCantidad());

                vtaDetalle.setProducto(producto);
                //System.out.println("vtaDet "+vtaDetalle.getIdVtaDet()+" "+vtaDetalle.getCantidad()+" "+vtaDetalle.getProducto());
                listaVtaDetalle.add(vtaDetalle);
            }
        } catch (Exception e) {
            //nada
        }
        return listaVtaDetalle;
    }
    /*public static void main(String[] args){
     String prueba = "[{\"idVtaDet\": \"1\", \"cantidad\": \"100\", \"idProd\": \"1\"},{\"idVtaDet\": \"2\", \"cantidad\": \"200\", \"idProd\": \"2\"},{\"idVtaDet\": \"3\", \"cantidad\": \"300\", \"idProd\": \"3\"}]";
     List<VentaDetalle> listaVtaDetalle = parsearVtaDetalles(prueba);
     System.out.println("Prueba: "+listaVtaDetalle.toString());
     }*/
}
